package org.lwjgl.demo.geometries;

import org.lwjgl.demo.device.TextureLoader;

/**
 * Cube定义
 *
 * @author zhoudy
 * @date 2025/10/29 21:50
 */
// ==================== 修改：更新立方体类支持法线和纹理坐标 ====================
public class Cube extends Mesh {

    public Cube() {
        // 顶点数据：位置(3) + 法线(3) + 纹理坐标(2) = 8个float
        // ==================== 修改：修复立方体顶点数据 ====================
        // 正确的立方体顶点数据：位置(3) + 法线(3) + 纹理坐标(2) = 8个float
        float[] vertices = {
                // 前面 (Z正方向)
                -0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 1.0f,  0.0f, 0.0f, // 左下 0
                0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 1.0f,  1.0f, 0.0f, // 右下 1
                0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 1.0f,  1.0f, 1.0f, // 右上 2
                -0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 1.0f,  0.0f, 1.0f, // 左上 3

                // 后面 (Z负方向)
                -0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 1.0f, 0.0f, // 左下 4
                -0.5f,  0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 1.0f, 1.0f, // 左上 5
                0.5f,  0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 0.0f, 1.0f, // 右上 6
                0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 0.0f, 0.0f, // 右下 7

                // 上面 (Y正方向)
                -0.5f,  0.5f, -0.5f,  0.0f, 1.0f, 0.0f,  0.0f, 1.0f, // 后左 8
                -0.5f,  0.5f,  0.5f,  0.0f, 1.0f, 0.0f,  0.0f, 0.0f, // 前左 9
                0.5f,  0.5f,  0.5f,  0.0f, 1.0f, 0.0f,  1.0f, 0.0f, // 前右 10
                0.5f,  0.5f, -0.5f,  0.0f, 1.0f, 0.0f,  1.0f, 1.0f, // 后右 11

                // 下面 (Y负方向)
                -0.5f, -0.5f, -0.5f,  0.0f, -1.0f, 0.0f, 0.0f, 0.0f, // 后左 12
                0.5f, -0.5f, -0.5f,  0.0f, -1.0f, 0.0f, 1.0f, 0.0f, // 后右 13
                0.5f, -0.5f,  0.5f,  0.0f, -1.0f, 0.0f, 1.0f, 1.0f, // 前右 14
                -0.5f, -0.5f,  0.5f,  0.0f, -1.0f, 0.0f, 0.0f, 1.0f, // 前左 15

                // 右面 (X正方向)
                0.5f, -0.5f, -0.5f,  1.0f, 0.0f, 0.0f,  0.0f, 0.0f, // 下后 16
                0.5f,  0.5f, -0.5f,  1.0f, 0.0f, 0.0f,  0.0f, 1.0f, // 上后 17
                0.5f,  0.5f,  0.5f,  1.0f, 0.0f, 0.0f,  1.0f, 1.0f, // 上前 18
                0.5f, -0.5f,  0.5f,  1.0f, 0.0f, 0.0f,  1.0f, 0.0f, // 下前 19

                // 左面 (X负方向)
                -0.5f, -0.5f, -0.5f,  -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // 下后 20
                -0.5f, -0.5f,  0.5f,  -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // 下前 21
                -0.5f,  0.5f,  0.5f,  -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, // 上前 22
                -0.5f,  0.5f, -0.5f,  -1.0f, 0.0f, 0.0f, 1.0f, 1.0f  // 上后 23
        };

        int[] indices = {
                0, 1, 2, 2, 3, 0,       // 后面
                4, 5, 6, 6, 7, 4,       // 前面
                8, 9, 10, 10, 11, 8,    // 左面
                12, 13, 14, 14, 15, 12, // 右面
                16, 17, 18, 18, 19, 16, // 下面
                20, 21, 22, 22, 23, 20  // 上面
        };

        setupMesh(vertices, indices);

        // ==================== 新增：为立方体设置纹理 ====================
        // 设置漫反射纹理（木箱纹理）
//        int diffuseTex = TextureLoader.loadTexture("res/textures/container.png");
//        setDiffuseTexture(diffuseTex);
//
//        // 设置镜面反射纹理（边框高光）
//        int specularTex = TextureLoader.createSolidColorTexture(255, 255, 255);
//        setSpecularTexture(specularTex);

        try {
            // 设置漫反射纹理（木箱纹理）
//            int diffuseTex = TextureLoader.loadTexture("res/textures/wood.jpeg");
            // ==================== 修改：直接使用纹理生成，不依赖外部文件 ====================
            int diffuseTex = TextureLoader.loadTexture("wooden_crate"); // 参数仅用于标识
            if (diffuseTex != 0) {
                setDiffuseTexture(diffuseTex);
                System.out.println("✅ 立方体漫反射纹理设置成功");
            }
           // 设置镜面反射纹理（边框高光）
//            int specularTex = TextureLoader.createSolidColorTexture(255, 255, 255);
            // 使用更亮的颜色和更高的对比度
            int specularTex = TextureLoader.createSpecularMap(64, 64); // 创建专门的高光贴图
            if (specularTex != 0) {
                setSpecularTexture(specularTex);
                System.out.println("✅ 镜面反射纹理设置成功（增强版）");
            }
        } catch (Exception e) {
            System.err.println("❌ 立方体纹理加载失败: " + e.getMessage());
        }
    }

    @Override
    public void render() {
        // ==================== 修改：添加纹理存在检查 ====================
        if (hasDiffuseTexture()) {
            org.lwjgl.opengl.GL13.glActiveTexture(org.lwjgl.opengl.GL13.GL_TEXTURE0);
            org.lwjgl.opengl.GL11.glBindTexture(org.lwjgl.opengl.GL11.GL_TEXTURE_2D, getDiffuseTexture());
        }

        if (hasSpecularTexture()) {
            org.lwjgl.opengl.GL13.glActiveTexture(org.lwjgl.opengl.GL13.GL_TEXTURE1);
            org.lwjgl.opengl.GL11.glBindTexture(org.lwjgl.opengl.GL11.GL_TEXTURE_2D, getSpecularTexture());
        }

        org.lwjgl.opengl.GL30.glBindVertexArray(vao);
        org.lwjgl.opengl.GL11.glDrawElements(org.lwjgl.opengl.GL11.GL_TRIANGLES, vertexCount, org.lwjgl.opengl.GL11.GL_UNSIGNED_INT, 0);
        org.lwjgl.opengl.GL30.glBindVertexArray(0);

        // 解绑纹理
        org.lwjgl.opengl.GL11.glBindTexture(org.lwjgl.opengl.GL11.GL_TEXTURE_2D, 0);
    }


}
